Skip to main content

11.3_Complete_REST_API_Design

Here are your complete, detailed structured notes (Part 2) — continuing from the previous notes, covering filtering, CRUD APIs, status codes, custom actions, consistency, and best practices.


REST API Design – Advanced Notes (Filtering, CRUD, Custom Actions)


Filtering in List APIs​

Concept​

  • Filtering allows clients to narrow down results based on conditions
  • Works via query parameters

Example: Filter by Status​

  • Query:

    • ?status=archived
  • Result:

    • Only organizations with status = archived returned

Multiple Filters​

  • Example:

    • ?status=active&name=org1
  • Server applies:

    • AND condition (typically)

Key Idea​

  • Filtering = server-side selection of subset of data

  • Works alongside:

    • Pagination
    • Sorting

CRUD APIs – Complete Flow


Update API (PATCH)​

Why PATCH (Preferred)​

  • Usually update partial fields
  • Common in modern apps (JSON-based SPAs)

Endpoint Pattern​

PATCH /organizations/{id}
  • Uses dynamic parameter (ID)

Request Body Example​

{
"status": "active"
}

Response​

  • Status: 200 OK

  • Returns:

    • Updated entity

Get Single Resource​

Endpoint​

GET /organizations/{id}

Behavior​

  • Returns:

    • Single resource
  • Status: 200 OK


Delete API​

Endpoint​

DELETE /organizations/{id}

Response​

  • Status: 204 No Content
  • Body: empty

Why No Content?​

  • Resource is deleted
  • Nothing left to return

Error Handling​


404 Not Found​

  • When:

    • Requesting specific resource
    • Resource does not exist

Example:

GET /organizations/6 → 404

Important Rule​

  • List API (GET /resources):

    • Return 200 with empty array
  • Single resource API:

    • Return 404 if not found

Example​

GET /organizations?status=random
→ data: []
→ status: 200

Custom Actions (Very Important)


What are Custom Actions?​

  • Actions that:

    • Don’t fit CRUD
    • Trigger complex backend logic

Example: Archive Organization​

  • Not just:

    • status = archived
  • Might also:

    • Delete projects
    • Notify users
    • Clean related data

Endpoint Design​

POST /organizations/{id}/archive

Structure​

  • Resource hierarchy:

    • /organizations/{id} → specific resource
    • /archive → action

Response​

  • Usually:

    • 200 OK
  • Not always 201 (depends on action)


Project APIs (Pattern Reuse)


Key Insight​

  • Same patterns apply to all resources:

    • organizations
    • projects
    • tasks

Create Project​

POST /projects

Payload​

{
"name": "Project 1",
"organizationId": "...",
"status": "planned",
"description": "..."
}

JSON Best Practice​

  • Always use camelCase
  • Maintain consistency across APIs

List Projects​

GET /projects

Supports:

  • Pagination
  • Sorting
  • Filtering

Get Single Project​

GET /projects/{id}

Update Project​

PATCH /projects/{id}

Delete Project​

DELETE /projects/{id}

→ Returns 204 No Content


Custom Action: Clone Project​


Why Not POST /projects?​

  • Clone may:

    • Copy tasks
    • Send emails
    • Trigger workflows

Endpoint​

POST /projects/{id}/clone

Behavior​

  • Creates new project

  • Returns:

    • 201 Created (since new resource created)

API Design Best Practices


1. Consistency (MOST IMPORTANT)​

  • Across:

    • Routes
    • Payloads
    • Responses

Example​

  • If using:

    • description → always use same key
  • Avoid:

    • desc, dsc etc.

2. Naming Rules​

  • Use plural resources:

    • /organizations
    • /projects
  • Avoid mixing styles


3. Avoid Abbreviations​

  • Bad:

    • desc
  • Good:

    • description

Reason:

  • Avoid confusion for API consumers

4. Provide Sensible Defaults​

For GET APIs​

  • Default:

    • page = 1
    • limit = 10/20
    • sort = createdAt desc

For POST APIs​

  • Example:

    • Default status = active

5. API Should Be Intuitive​

  • No guesswork required
  • Easy to use without reading code

6. Documentation​

  • Use:

    • Swagger / OpenAPI

Benefits​

  • Interactive testing
  • Clear contract
  • Better integration

Design Philosophy


APIs Are Designed First​

  • NOT coded first

Process​

  1. Design interface
  2. Define behavior
  3. Then implement logic

Why?​

  • Helps:

    • Think like API consumer
    • Avoid bad design
    • Ensure consistency

Tools​

  • Postman / Insomnia → design
  • Swagger → documentation

Final Takeaways

  • CRUD + Custom actions form full API system

  • POST = flexible method for non-standard operations

  • Always:

    • Keep APIs consistent
    • Follow REST semantics
    • Provide defaults
    • Avoid ambiguity
  • Think from:

    • Client perspective, not backend